package cc.rengu.redp.bizimpl.igas.service.impl;

import cc.rengu.redp.bizimpl.igas.dao.PTxnCfgMapper;
import cc.rengu.redp.bizimpl.igas.domain.PTxnCfg;
import cc.rengu.redp.bizimpl.igas.domain.PTxnCfg;
import cc.rengu.redp.bizimpl.igas.domain.PTxnCfg;
import cc.rengu.redp.bizimpl.igas.domain.PTxnCfg;
import cc.rengu.redp.bizimpl.igas.service.PTxnCfgService;
import cc.rengu.redp.bizimpl.igas.vo.PTxnAuthMap;
import cc.rengu.redp.bizimpl.igas.vo.PTxnGroup;
import cc.rengu.redp.bizimpl.upmp.common.BusinessContainer;
import cc.rengu.redp.bizimpl.upmp.vo.UpmpUserInfoVO;
import cc.rengu.redp.bizimpl.utils.Common;
import cc.rengu.redp.bizimpl.utils.CommonUtils;
import cc.rengu.redp.common.domain.QueryRequest;
import cc.rengu.redp.common.exception.RedpException;
import cc.rengu.redp.common.utils.SortUtil;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Maps;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.util.*;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author 刘玉亮.LL
 * @since 2021-06-09
 */
@DS("igas")
@Service
public class PTxnCfgServiceImpl extends ServiceImpl<PTxnCfgMapper, PTxnCfg> implements PTxnCfgService {

    @Override
    public IPage<PTxnCfg> findByPage(QueryRequest request, PTxnCfg info) {
        try {
            LambdaQueryWrapper<PTxnCfg> queryWrapper = new LambdaQueryWrapper<>();
            if (StringUtils.isNotBlank(info.getTxnNum())) {
                queryWrapper.likeRight(PTxnCfg::getTxnNum, info.getTxnNum());
            }
            if (StringUtils.isNotBlank(info.getBizType())) {
                queryWrapper.likeRight(PTxnCfg::getBizType, info.getBizType());
            }
            if (StringUtils.isNotBlank(info.getTxnGroup())) {
                queryWrapper.likeRight(PTxnCfg::getTxnGroup, info.getTxnGroup());
            }
            if (StringUtils.isNotBlank(info.getBizProdCode())) {
                queryWrapper.likeRight(PTxnCfg::getBizProdCode, info.getBizProdCode());
            }
            Page<PTxnCfg> page = new Page<>();
            SortUtil.handlePageSort(request, page, true);
            return this.page(page, queryWrapper);
        } catch (Exception e) {
            log.error("查询失败", e);
            return null;
        }
    }

    @Override
    public List<PTxnCfg> findPTxnCfgByList(String txnNum, String bizType, String txnGroup, String bizProdCode) throws RedpException {
     LambdaQueryWrapper<PTxnCfg> wrapper = new LambdaQueryWrapper<>();
        if (StringUtils.isNotBlank(txnNum)) {
            wrapper.eq(PTxnCfg::getTxnNum, txnNum);
        }
        if (StringUtils.isNotBlank(bizType)) {
            wrapper.eq(PTxnCfg::getBizType, bizType);
        }
        if (StringUtils.isNotBlank(txnGroup)) {
            wrapper.eq(PTxnCfg::getTxnGroup, txnGroup);
        }
        if (StringUtils.isNotBlank(bizProdCode)) {
            wrapper.eq(PTxnCfg::getBizProdCode, bizProdCode);
        }
        if (StringUtils.isBlank(txnNum) && StringUtils.isBlank(bizType) &&
                StringUtils.isBlank(txnGroup) && StringUtils.isBlank(bizProdCode)) {
            wrapper.last(" where rownum<=" + Integer.parseInt(BusinessContainer.ECP_PAGE_MAXROWS));
        } else {
            wrapper.last(" and rownum<=" + Integer.parseInt(BusinessContainer.ECP_PAGE_MAXROWS));
        }
        List<PTxnCfg> list = this.list(wrapper);
        if (null != list && list.size() > 0) {
            return list;
        }
        return null;
    }

    @Override
    public PTxnCfg findOne(String txnNum, String bizType, String txnGroup, String bizProdCode) throws RedpException {
        LambdaQueryWrapper<PTxnCfg> queryWrapper = new LambdaQueryWrapper<>();
        if (!Common.isBlank(txnNum)) {
            queryWrapper.eq(PTxnCfg::getTxnNum, txnNum);
        } else {
            throw new RedpException("查询交易信息配置唯一索引列[bizType]条件为空");
        }
        if (!Common.isBlank(bizType)) {
            queryWrapper.eq(PTxnCfg::getBizType, bizType);
        } else {
            throw new RedpException("查询交易信息配置唯一索引列[bizType]条件为空");
        }
        if (!Common.isBlank(txnGroup)) {
            queryWrapper.eq(PTxnCfg::getTxnGroup, txnGroup);
        } else {
            throw new RedpException("查询交易信息配置唯一索引列[txnGroup]条件为空");
        }
        if (!Common.isBlank(bizProdCode)) {
            queryWrapper.eq(PTxnCfg::getBizProdCode, bizProdCode);
        } else {
            throw new RedpException("查询交易信息配置唯一索引列[bizProdCode]条件为空");
        }
        return this.getOne(queryWrapper);
    }

    /**
     * 根据基础产品查询交易分组，每个交易分组下包含哪些交易
     *
     * @param txnGroup
     * @param bizProdCode
     * @return
     * @throws RedpException
     */
    @Override
    public List<PTxnGroup> findPTxnGroupByList(String txnGroup, String bizProdCode) throws RedpException {
        QueryWrapper<PTxnCfg> wrapper = new QueryWrapper<>();
        wrapper.select("DISTINCT TXN_GROUP", "BIZ_PROD_CODE");
        if (StringUtils.isNotBlank(txnGroup)) {
            wrapper.lambda().eq(PTxnCfg::getTxnGroup, txnGroup);
        }
        if (StringUtils.isNotBlank(bizProdCode)) {
            wrapper.lambda().eq(PTxnCfg::getBizProdCode, bizProdCode);
        }
        List<PTxnGroup> groups = new ArrayList<>();
        PTxnGroup group;
        List<PTxnCfg> pTxnCfgList = this.list(wrapper);
        for (PTxnCfg cfg : pTxnCfgList) {
            group = new PTxnGroup();
            group.setpTxnAuthMaps(findPTxnNumByList("", cfg.getTxnGroup(), cfg.getBizProdCode()));
            group.setTxnGroup(cfg.getTxnGroup());
            group.setProdCode(cfg.getBizProdCode());
            groups.add(group);
        }
        return groups;
    }

    public List<PTxnAuthMap> findPTxnNumByList(String txnNum, String txnGroup, String bizProdCode) {
        LambdaQueryWrapper<PTxnCfg> wrapper = new LambdaQueryWrapper<>();
        if (StringUtils.isNotBlank(txnNum)) {
            wrapper.eq(PTxnCfg::getTxnNum, txnNum);
        }
        if (StringUtils.isNotBlank(txnGroup)) {
            wrapper.eq(PTxnCfg::getTxnGroup, txnGroup);
        }
        if (StringUtils.isNotBlank(bizProdCode)) {
            wrapper.eq(PTxnCfg::getBizProdCode, bizProdCode);
        }
        List<PTxnAuthMap> maps = new ArrayList<>();
        PTxnAuthMap map;
        List<PTxnCfg> pTxnCfgList = this.list(wrapper);
        for (PTxnCfg cfg : pTxnCfgList) {
            map = new PTxnAuthMap();
            map.setTxnNum(cfg.getTxnNum());
            map.setBizType(cfg.getBizType());
            map.setTxnGroup(cfg.getTxnGroup());
            map.setProdCode(cfg.getBizProdCode());
            map.setTxnName(cfg.getTxnName());
            maps.add(map);
        }
        return maps;
    }
}
